прохождение кадра данных панд и других объектов между двумя маршрутами фляги - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть веб-приложение для колб, которое я пытаюсь использовать для просмотра / извлечения некоторых данных из базы данных (asticsearch).По статистическим причинам данные представляют собой простую случайную выборку.Данные из запроса к БД возвращаются в виде кадра данных pandas и создаются по одному маршруту.Мне нужно передать этот dataframe во второй маршрут.

Из-за случайности, если я попытаюсь повторно выполнить запрос БД на втором маршруте, он, естественно, вернет другую случайную выборку.По причинам, выходящим за рамки этого вопроса ,asticsearch поддерживает передачу начальных значений, но они значительно замедляют запрос к БД (и в принципе я считаю, что для этого не требуется 2 отдельных запроса к БД).

У меня естьмаршрут view_data, который позволяет пользователям просматривать данные, и второй маршрут download_data, который позволяет пользователю загружать файл в формате CSV, TSV или JSON.Я хочу позволить пользователям просматривать данные, и если данные соответствуют ожидаемым, нажмите на URL, чтобы загрузить набор данных, который они просматривают.

view_data выглядит примерно так:

@app.route('/view_data', methods=['GET'])
def view_data():
  df = get_random_sample_from_database()
  return render_template('view_data.html', dataframe = df)

HTML для просмотра данных view_data.html:

<code><html>
  <body>
    <!-- this shows data to user -->
    <pre>
      {% if not dataframe.empty %}
      {{dataframe.__repr__()|safe}}
      {% endif %}
    
загрузить вышеуказанные данные

Функция для download_data:

@app.route('/download_data', methods=['GET'])
def download_data():
  # Use some magic here to get the df created in view_data
  return Response(
    df.to_csv(),
    mimetype="text/csv",
    headers={"Content-disposition":"attachment; filename=data.csv"})

Вот несколько различных методов, которые я исследовал:

  1. сеансов во фляге: похоже, данные в браузере пользователя хранятся в виде безопасного cookie.Я не хочу идти по этому пути, потому что случайная выборка может быть где-то от 1 МБ до 100 + МБ.
  2. flask.g: Я пробовал это, но не могу понять, как это сделать правильно, так как япродолжайте получать '_AppCtxGlobals' object has no attribute ошибки типа.

Вот что я попытался сделать (2):

from flask import g

@app.route('/view_data', methods=['GET'])
def view_data():
  df = get_random_sample_from_database()
  g.data = df
  return render_template('view_data.html', dataframe = df)

@app.route('/download_data', methods=['GET'])
def download_data():
  df = g.data
  return Response(
    df.to_csv(),
    mimetype="text/csv",
    headers={"Content-disposition":"attachment; filename=data.csv"})

Есть ли простой способ создать кадр данных в view_data и передать его в download_data?Есть ли лучший способ позволить пользователю просматривать данные с возможностью загрузки данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...